// 主域名
const domain = "https://cn.bing.com";
// https
const https = require('https');
// 文件
const fs = require("fs")
// 请求
const request = require("request")
// ORM
const { Sequelize, INTEGER, STRING } = require('sequelize');
const sequelize = new Sequelize({
  host: 'localhost',
  dialect: 'sqlite',
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },
  storage: './wallpaper.sqlite',
  // operatorsAliases: false
});
// 文件
const ImageArchive = sequelize.define("image_archive", {
    id : {
        type: INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    folderName : STRING(100),
    fileName : STRING(100),
    copyright : STRING(200),
});

/**
 * 文件夹不存在时创建
 * @param {*} fileFolder 文件夹
 * @param {*} callback 回调函数
 */
function createFolder(fileFolder, callback) {
    fs.access(fileFolder, fs.constants.R_OK, (err)=>{
        // 文件夹不存在
        if (err) {
            // 创建文件夹
            fs.mkdir(fileFolder, { recursive: true}, (err)=>{
                if (!err) {
                    callback();
                }
            });
        } else {
            callback();
        }
    })
}

/**
 * 保存文件
 * @param {*} imgUrl 图片URL
 * @param {*} fileFolder 文件夹路径
 * @param {*} fileName 文件名称
 */
function saveFile(imgUrl, fileFolder, fileName) {
    // 文件名
    let filePath = fileFolder + "/" + fileName + ".jpeg"; 
    // 检查文件是否存在
    fs.access(filePath, fs.constants.R_OK, (err) =>{
        // 文件不存在
        if (err) {                                       
            console.log(filePath + " Not Found");
            // 文件写入管道
            let fileStream = fs.createWriteStream(`${filePath}`, {autoClose: true})
            // 保存文件
            request(imgUrl).pipe(fileStream);
            // 文件流关闭
            fileStream.on('close', (err) => {
                console.log(`${filePath} OK`)
                if (err) {
                    console.log(err);
                }
            });
        } else {
            console.log(filePath + " Exist");
        }
    });
}

/**
 * 保存到数据库
 * @param {*} folderName 文件夹名称
 * @param {*} fileName 文件名
 * @param {*} copyright 版权
 */
function saveImageArchive(folderName, fileName, copyright) {
    ImageArchive.sync().then(()=>{
        ImageArchive.findAll({
            where:{
                fileName:fileName
            }   
        }).then((res)=>{
            if (!res || res.length <= 0) {
                ImageArchive.create({
                    folderName:folderName,
                    fileName:fileName,
                    copyright:copyright
                })
            }
        })
    });
}
/**
 * 解析数据
 * @param {*} images 图片列表
 */
function parseData(images) {
    // 遍历
    for(var i = 0; i < images.length; i++) {
        // 图片信息对象
        let img = images[i];
        let imgUrl = domain + img.url;
        console.log(imgUrl)
        // 年月（文件夹分类）
        let folderName = img.enddate.substring(0, img.enddate.length - 2);
        // 存储路径
        let fileFolder = "./static/wallpaper/" + folderName;
        // 判断文件夹是否存在
        createFolder(fileFolder, ()=>{
            saveFile(imgUrl, fileFolder, img.enddate);
        });
        
        // 保存到数据库
        saveImageArchive(folderName, img.enddate, img.copyright);
    }
}

(()=>{
    https.get(domain + "/HPImageArchive.aspx?format=js&idx=0&n=8", function(res){
        let str = []
        res.on('data', d => {
            str += d;
        })
        res.on('end', function() {
            // 转换Json对象
            let json = JSON.parse(str);
            console.log(json);
            // 解析数据
            parseData(json.images);
        })
    });
})();